/**
 * Copyright 2009 - ChunMap
 * 
 * 这个文件是ChunMap项目的一部分。
 * ChunMap是开源软件。
 * 你可以自由复制、传播本项目的下载包文件，但必须保持其完整性。
 * 我们不用对使用中的风险及由此造成的损失承担任何责任。
 * 详细情况请见《ChunMap许可协议》。

 * 想了解更多有关ChunMap的信息，请访问http://code.google.com/p/chunmap/
 */
package chunmap.orm.mapping.column;

import java.lang.reflect.Field;
import java.sql.ResultSet;

import chunmap.orm.mapping.type.DataType;
import chunmap.util.ChunDaoException;

public class Column {
	protected DataType dataType;
	protected String dbName;
	protected int index;
	protected String jName;

	protected Field field;

	public Column(String name, DataType dataType) {
		this(name, name, dataType);
	}

	public Column(String jName, String dbName, DataType dataType) {
		super();
		this.dataType = dataType;
		this.dbName = dbName;
		this.jName = jName;
	}

	public void setType(Class<?> type) {
		try {
			field = type.getDeclaredField(jName);
		} catch (SecurityException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} catch (NoSuchFieldException e) {
			
			if (type.getSuperclass()!=null) {
				setType(type.getSuperclass());
				return;
			}
			
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		field.setAccessible(true);
	}

	public void setIndex(int i) {
		index = i;
	}

	public String getDbName() {
		return dbName;
	}

	public DataType getDataType() {
		return dataType;
	}

	@Override
	public String toString() {
		return dbName + " " + dataType.toString();
	}

	public static String firstUpper(String str) {
		String first = str.charAt(0) + "";
		first = first.toUpperCase();
		return first + str.substring(1);
	}

	public Object getValue(Object obj) {
		// return Reflection.invokeGetter(obj, beanGetName);
		try {
			return field.get(obj);
		} catch (IllegalArgumentException e) {
			throw new ChunDaoException(e);
		} catch (IllegalAccessException e) {
			throw new ChunDaoException(e);
		}
	}

	public void readValue(Object obj, ResultSet rs) {
		Object value = dataType.readData(rs, index + 1);
		// Reflection.invokeSetter(obj, beanSetName, value);
		if (value == null) {
			return;
		}
		try {
			field.set(obj, value);
		} catch (IllegalArgumentException e) {
			throw new ChunDaoException(e);
		} catch (IllegalAccessException e) {
			throw new ChunDaoException(e);
		}
	}
}
